﻿using System;

namespace VsxFactory.Modeling.Strategies
{
    /// <summary>
    /// Stratégie de nommage. Disponible à partir de <see cref="IStrategyManagerService"><IStrategyManagerService</see>/>
    /// Cette stratégie est utilisée pour générer et valider les noms des éléments à générer
    /// </summary>
    public interface INamingStrategy //: IStrategy
    {
        /// <summary>
        /// Création du nom d'un champ privé
        /// </summary>
        /// <param name="varName">Nom de la variable initiale</param>
        /// <returns>Nom du champ privé</returns>
        string CreatePrivateVariableName(string varName);
        /// <summary>
        /// Valide si le nom est un identifiant valide
        /// </summary>
        /// <param name="className">Nom d'un type</param>
        /// <returns>true si le nom est valide</returns>
        bool IsClassNameValid(string className);
        /// <summary>
        /// Valide si le nom de namespace est valide
        /// </summary>
        /// <param name="namespace">Nom du namespace</param>
        /// <returns>true si le namespace est valide</returns>
        bool IsNamespaceValid(string @namespace);
        /// <summary>
        /// Convertie un nom en respectant la codification camel casing (1ere lettre en minuscule)
        /// </summary>
        /// <param name="name">Nom à convertir</param>
        /// <returns>Nom en camel case</returns>
        string ToCamelCasing(string name);
        /// <summary>
        /// Convertie un nom en respectant la codification pascal casing (Toutes les 1ere lettres en majuscules)
        /// </summary>
        /// <param name="name">Nom à convertir</param>
        /// <returns>Nom en camel case</returns>
        string ToPascalCasing(string name);
        /// <summary>
        /// Création d'un nom d'aprés son contexte d'utilisation
        /// </summary>
        /// <typeparam name="T">Contexte d'utilisation</typeparam>
        /// <param name="name">Nom initial</param>
        /// <returns>Nouveau nom</returns>
        string CreateName<T>(string name) where T : class;
    }
}
